package com.sxt;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

public class GameWin extends JFrame {
    //0 未开始 1 运行中 2 商店 3 失败 4 胜利

    //创建一个集合用来存储金块,石块
    List<Object> objectList = new ArrayList<>();
    //定义Bg以便引用方法
    Bg bg = new Bg();
    //定义Line以便调用line(进行抓取判定时，定义一个有参构造，new时需要传入参数）
    Line line = new Line(this);

    //写一个for循环添加金块,石块
    {
        //是否可以放置
        boolean isPlace = true;

        for (int i = 0; i < 12; i++) {
            //添加一个随机数随机生成不同大小金块
            double random = Math.random();
            Gold gold;//用来存放当前生成的金块

            if (random < 0.3) {gold = new GoldMini();}
            else if (random < 0.7) {gold = new Gold();}
            else{gold = new Goldplus();}

            //循环判断每次生成的金块是否与前面的金块重叠
            for(Object obj : objectList){
                //检测是否重叠
                if(gold.getRec().intersects(obj.getRec())){
                    //如果重叠不能放置，需要重新放置
                    isPlace = false;
                }
            }
            if(isPlace){objectList.add(gold);}
            //添加一次循环，因为此次循环重叠
            else{isPlace = true;i--;}
        }
        for (int i = 0; i < 5; i++) {
            Rock rock = new Rock();
            for(Object obj:objectList){
                if(rock.getRec().intersects (obj.getRec())){
                    isPlace = false;
                }
            }if (isPlace){
                objectList.add(rock);
            }
            else{isPlace = true;i--;}
        }
    }

    //定义一张画布（运用双缓存技术解决闪动现象---->循环体中先绘制画布，在绘制主体金块等物体以此造成一种闪动现象)
    Image offScreenImage;

    //初始化窗口信息
    void launch(){
        //设置窗口是否可见
        this.setVisible(true);
        //设置窗口大小
        this.setSize(1080, 588);
        //设置窗口位置(null) 让窗口居中
        this.setLocationRelativeTo(null);
        //设置窗口标题
        this.setTitle("小魏练手小游戏");

        //关闭窗口方法(点击窗口或叉×关闭程序）
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //设置鼠标事件，通过鼠标事件修改状态
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                //添加鼠标左键事件
                if(e.getButton() == 1 && line.state == 0){//左右摇摆
                    line.state = 1;
                }

                //添加鼠标右键事件
                if(e.getButton() == 3 && line.state == 3){//抓取返回
                    //右键点击，状态修改
                    Bg.waterFlag = true;
                    Bg.waterNum--;
                }
            }
        });

        //重复绘制图片，以此让画面动起来，否则只会停留在初始画面
        while(true){
            repaint();
            nextLevel();
        //设置10毫秒刷新一次，防止旋转过快
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    //过关后重新刷新
    public void nextLevel(){
        if(Bg.count >= bg.goal)
        {
            Bg.level++;
            //释放上一个窗口
            dispose();
            GameWin gameWin = new GameWin();
            //重新刷新
            gameWin.launch();
        }
    }

    //编写绘制方法
    @Override
    public void paint(Graphics g) {

        //此画布窗口与游戏窗口相同大小
        offScreenImage = this.createImage(1080, 588);
        //为画布添加画笔,只要调用此画笔就是在此画布上绘制
        Graphics gImage = offScreenImage.getGraphics();
        //将背景，物品绘制到此画布上
        bg.painSelf(gImage);

        //定义gold一边调用方法,采用增强for循环的方法进行生成，否则使用Gold gold = new Gold();只会生成一个金块
        for(Object obj:objectList){
            obj.paintSelf(gImage);
        }
        //绘制线
        line.paintself(gImage);
        //再将此画布绘制到窗口当中
        g.drawImage(offScreenImage, 0, 0, null);
    }

    //程序入口
    public static void main(String[] args) {
        //new一个gw类来调用launch方法
        GameWin gw = new GameWin();
        //调用方法launch
        gw.launch();

    }
}